﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Persistencia;
using GestorDeFlotasModelo.Entities;
using System.Data.SqlClient;
namespace GestorDeFlotasModelo.Factorias
{
    public class FactoriaRolPorUsuario : Factoria
    {
        private FactoriaRolPorUsuario(TransaccionBase tran)
            : base(tran)
        {
        }


        public override string NombreTabla
        {
            get { return " NUESTRA_RUBIA_ES_MEJOR.RolPorUsuario "; }
        }

        protected override IPersistibleModelo NuevoPersistible(HashTableNCSensitive htsNc)
        {
            return new RolPorUsuario();
        }

        protected override string Id(HashTableNCSensitive hts)
        {
            return hts["RolPorUsuario_Usuario"] + "|" + hts["RolPorUsuario_Rol"];
        }

        public List<Usuario> SelectUsuarioXRol(Rol rol)
        {
            SqlCommand comm = new SqlCommand();
            comm.CommandText = "SELECT * FROM"+this.NombreTabla+" WHERE RolPorUsuario_Rol=@RolPorUsuario_Rol";
            comm.Parameters.AddWithValue("@RolPorUsuario_Rol", rol.Id);
            List<RolPorUsuario> usuariosXRoles = base.Select<RolPorUsuario>(comm, delegate(IPersistibleModelo iPer) { return ((RolPorUsuario)iPer).Rol.Id == rol.Id; }, 0);
            List<Usuario> usuarios = new List<Usuario>();
            usuariosXRoles.ForEach(delegate(RolPorUsuario RolPorUsuario) { usuarios.Add(RolPorUsuario.Usuario); });
            return usuarios;

        }

        public List<Rol> SelectRolPorUsuario(Usuario usuario)
        {
            SqlCommand comm = new SqlCommand();
            comm.CommandText = "SELECT * FROM "+this.NombreTabla+" WHERE RolPorUsuario_Usuario=@RolPorUsuario_Usuario";
            comm.Parameters.AddWithValue("@RolPorUsuario_Usuario", usuario.Id);
            List<RolPorUsuario> rolesXUsuario = base.Select<RolPorUsuario>(comm, delegate(IPersistibleModelo iPer) { return ((RolPorUsuario)iPer).Usuario.Username == usuario.Username; }, 0);
            List<Rol> roles = new List<Rol>();
            rolesXUsuario.ForEach(delegate(RolPorUsuario RolPorUsuario) { roles.Add(RolPorUsuario.Rol); });
            return roles;

        }

        protected override HashTableNCSensitive ParametrosClave()
        {
            HashTableNCSensitive parameters = new HashTableNCSensitive();
            parameters.Add("RolPorUsuario_Rol", null);
            parameters.Add("RolPorUsuario_Usuario", null);
            return parameters;
            
        }

        protected override HashTableNCSensitive ParametrosNoClave()
        {
            HashTableNCSensitive parameters = new HashTableNCSensitive();
            return parameters;
        }


        protected override Predicate<IPersistibleModelo> FiltroXId(string id)
        {
            return delegate(IPersistibleModelo iPer)
            {
                return ((RolPorUsuario)iPer).Rol.Id == long.Parse(id.Split('|')[1]) &&
                         ((RolPorUsuario)iPer).Usuario.Id == long.Parse(id.Split('|')[0]);
            };
        }

        public RolPorUsuario Nuevo(Rol rol, Usuario usuario)
        {
            RolPorUsuario rolXUser = new RolPorUsuario();
            rolXUser.Rol = rol;
            rolXUser.Usuario = usuario;
            base.Agregar(rolXUser);
            return rolXUser;
        }
    }
}
